package objetosNegocio;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.ResourceBundle;

import dto.DTOCuentaBancaria;

import vo.CuentaBancaria;
import vo.CuentaUsuario;
import vo.Usuario;


import accesoDatos.daos.DaoCuentaBancaria;
import accesoDatos.daos.DaoCuentaUsuario;
import accesoDatos.daos.DaoUsuarios;
import accesoDatos.dataSource.DataSource;

import accesoDatos.excepciones.ExcepcionesDeDaos;
import accesoDatos.excepciones.ExcepcionesDeFabricas;
import accesoDatos.fabrica.Fabrica;

public class ObjetoDeNegocioControlUsuarios 
{
	private Fabrica fabrica;
	private DataSource conexionBD;
	
	public ObjetoDeNegocioControlUsuarios()
	{
		try 
		{
			fabrica = Fabrica.obtenerInstancia();
		} 
		catch (ExcepcionesDeFabricas e) 
		{
			e.printStackTrace();
		}
		
		conexionBD = new DataSource(ResourceBundle.getBundle("accesoDatos.propiedades.motoresBD").getString("DataSourceFabrica"));
	}
	
	public  boolean ingresarUsuario(Usuario usuario, CuentaBancaria cuentaBancaria)
	{
		Connection conexion = conexionBD.getConexion();
		
		try 
		{
			conexion.setAutoCommit(false);
			
			int codigoUsuario = -1;
			DaoUsuarios daoUsuarios = fabrica.obtenerDaoUsarios(conexion);
			
			try 
			{
				Usuario yaExiste = daoUsuarios.obtenerUsuarioPorLogin(usuario);
				
				if(yaExiste == null)
				{
					Usuario usuarioObtenido = daoUsuarios.ingresarUsuario(usuario);
					
					if(usuarioObtenido != null)
					{
						codigoUsuario = usuarioObtenido.getCodigo();
					}
					else
					{
						conexion.rollback();
						return false;
					}
				}
				
				else
				{
					conexion.rollback();
					return false;
				}
				
			} 
			catch (ExcepcionesDeDaos e) 
			{
				conexion.rollback();
				e.printStackTrace();
				
				return false;
			}
			
			int codigoCuentaBancaria = -1;
			DaoCuentaBancaria daoCuentaBancaria = fabrica.obtenerDaoCuentaBancaria(conexion);
			
			try 
			{
				CuentaBancaria cuentaObtenida = daoCuentaBancaria.ingresarCuentaBancaria(cuentaBancaria);
				
				if(cuentaObtenida != null)
				{
					codigoCuentaBancaria = cuentaObtenida.getCodigo();
				}
				else
				{
					conexion.rollback();
					return false;
				}
				
			} 
			catch (ExcepcionesDeDaos e) 
			{
				conexion.rollback();
				e.printStackTrace();
				
				return false;
			}
			
			DaoCuentaUsuario daoCuentaUsuario = fabrica.obtenerDaoCuentaUsuario(conexion);
			
			CuentaUsuario cuentaUsuario = new CuentaUsuario(-1,codigoUsuario,codigoCuentaBancaria);
			
			try 
			{
				daoCuentaUsuario.ingresarCuentaUsuario(cuentaUsuario);
			} 
			catch (ExcepcionesDeDaos e) 
			{
				conexion.rollback();
				e.printStackTrace();
				
				return false;
			}
			
			conexion.commit();
			
		} 
		catch (SQLException e1) 
		{
			e1.printStackTrace();
		}
		finally
		{
			try 
			{
				conexion.close();
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
		}
				
		return true;
	}
	
	public boolean actualizarUsuario(Usuario usuario, Usuario nuevoUsuario, CuentaBancaria cuentaBancaria)
	{
		Connection conexion = conexionBD.getConexion();
		
		try 
		{
			conexion.setAutoCommit(false);
			
			Usuario usuarioObtenido = null;
			DaoUsuarios daoUsuarios = fabrica.obtenerDaoUsarios(conexion);
			
			try 
			{
				usuarioObtenido = daoUsuarios.obtenerUsuarioPorLogin(usuario);
				
				if(usuarioObtenido != null)
				{
					usuario.setCodigo(usuarioObtenido.getCodigo());
					
					nuevoUsuario.setCodigo(usuarioObtenido.getCodigo());
					daoUsuarios.actualizarUsuario(nuevoUsuario);					
				}
				else
				{
					conexion.rollback();
					return false;
				}
			} 
			catch (ExcepcionesDeDaos e)
			{
				conexion.rollback();
				e.printStackTrace();
				
				return false;
			}
			
			DTOCuentaBancaria cuentaBancariaObtenida = null;
			DaoCuentaBancaria daoCuentaBancaria = fabrica.obtenerDaoCuentaBancaria(conexion);
			
			if(cuentaBancaria != null)
			{
				try 
				{
					cuentaBancariaObtenida = daoCuentaBancaria.buscarCuenta(usuarioObtenido);
					
					if(cuentaBancariaObtenida != null)
					{
						cuentaBancaria.setCodigo(cuentaBancariaObtenida.getCodigoCuenta());
						daoCuentaBancaria.actualizarCuentaBancaria(cuentaBancaria);
					}
					else
					{
						conexion.rollback();
						return false;
					}
				} 
				catch (ExcepcionesDeDaos e) 
				{
					conexion.rollback();
					e.printStackTrace();
					
					return false;
				}
			}
			
			conexion.commit();
			
		} 
		catch (SQLException e1) 
		{
			e1.printStackTrace();
		}
		finally
		{
			try 
			{
				conexion.close();
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
		}
		
		return true;
	}
	
	public ArrayList<Usuario> obtenerUsuarios()
	{
		Connection conexion = conexionBD.getConexion();
		
		try 
		{
			conexion.setAutoCommit(false);
			
			ArrayList<Usuario>usuariosObtenidos = null;
			
			DaoUsuarios daoUsuarios = fabrica.obtenerDaoUsarios(conexion);
			
			try 
			{
				usuariosObtenidos = daoUsuarios.obtenerUsuarios();
				
				if(usuariosObtenidos != null)
				{
					return usuariosObtenidos;
				}
			} 
			catch (ExcepcionesDeDaos e) 
			{
				conexion.rollback();
				e.printStackTrace();
				
				return null;
			}
			
		}
		catch (SQLException e1) 
		{
			e1.printStackTrace();
		}
		finally
		{
			try 
			{
				conexion.close();
			}
			catch (SQLException e)
			{
				e.printStackTrace();
			}
		}
		
		return null;
	}
	
	public Usuario obtenerUsuario(Usuario usuario)
	{
		Connection conexion = conexionBD.getConexion();
		
		try 
		{
			conexion.setAutoCommit(false);
			
			DaoUsuarios daoUsuario = fabrica.obtenerDaoUsarios(conexion);
			
			try 
			{
				Usuario UsuarioObtenido = daoUsuario.obtenerUsuarioPorLogin(usuario);
				
				conexion.commit();
				
				return UsuarioObtenido;
			} 
			catch (ExcepcionesDeDaos e) 
			{
				conexion.rollback();
				return null;
			}
		} 
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
		finally
		{
			try 
			{
				conexion.close();
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
		}
		
		return null;
	}
	
	public CuentaBancaria obtenerCuentaBancaria(Usuario usuario)
	{
		Connection conexion = conexionBD.getConexion();
		
		try 
		{
			conexion.setAutoCommit(false);
			
			DaoCuentaBancaria daoCuentaBancaria = fabrica.obtenerDaoCuentaBancaria(conexion);
			
			try 
			{
				DTOCuentaBancaria cuenta = daoCuentaBancaria.buscarCuenta(usuario);
				CuentaBancaria cuentaBancaria = new CuentaBancaria(cuenta.getCodigoCuenta(),cuenta.getNumeroCuenta(),-1,-1);
				
				if(cuenta.getNombreBanco().equals("Bancolombia"))
				{
					cuentaBancaria.setBanco(1);
				}
				if(cuenta.getNombreBanco().equals("Davivienda"))
				{
					cuentaBancaria.setBanco(2);
				}
				if(cuenta.getNombreBanco().equals("BBVA"))
				{
					cuentaBancaria.setBanco(3);
				}
				if(cuenta.getNombreBanco().equals("Banco Agrario"))
				{
					cuentaBancaria.setBanco(4);
				}
				if(cuenta.getNombreBanco().equals("Banco Santander"))
				{
					cuentaBancaria.setBanco(5);
				}
				if(cuenta.getNombreBanco().equals("Banco Caja Social"))
				{
					cuentaBancaria.setBanco(6);
				}
				if(cuenta.getNombreBanco().equals("Banco de Bogota"))
				{
					cuentaBancaria.setBanco(7);
				}
				
				if(cuenta.getNombreTipoCuenta().equals("Ahorro"))
				{
					cuentaBancaria.setTipoCuenta(1);
				}
				if(cuenta.getNombreTipoCuenta().equals("Corriente"))
				{
					cuentaBancaria.setTipoCuenta(2);
				}
				
				conexion.commit();
				return cuentaBancaria;
			} 
			catch (ExcepcionesDeDaos e) 
			{
				conexion.rollback();
				return null;
			}
			
		} 
		catch (SQLException e1) 
		{
			e1.printStackTrace();
		}
		finally
		{
			try 
			{
				conexion.close();
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
		}
		
		return null;
	}
}
